/*
 * Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
 *
 * Licensed under the Mulan PSL v2.
 * You can use this file according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of the License at
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
 * FOR MORE DETAILS.
 */

#pragma once

#include <vector>

#include "Utility/Algebra/Matrix.h"

#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/Out.h"
#include "DataStructure/Common/Status.h"
#include "DataStructure/Input/Coordinate/ICoordinate.h"
#include "DataStructure/Input/Element/ElementTypes.h"

#include "DBManager/Common/DBManagerNamespace.h"

SG_DBMANAGER_NAMESPACE_OPEN

template <typename T>
class AddTrait
{
  public:
    using ServiceDataType = T;
    /**
     * @brief   : 添加数据
     * @param   : entity 数据类型
     * @return  : 是否成功
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual SG::DataStructure::Common::Status Add (T& entity) = 0;

    /**
     * @brief   : 使用vector添加数据
     * @param   : entity 数据类型
     * @return  : 是否成功
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual SG::DataStructure::Common::Status MAdd (std::vector<T>& entity) = 0;
};

template <typename T>
class AddBatchTrait
{
  public:
    /**
     * @brief   : 使用vector添加数据
     * @param   : entity 数据类型
     * @return  : 是否成功
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    // virtual SG::DataStructure::Common::Status MAdd (std::vector<T>& entity) = 0;
};

class SizeTrait
{
  public:
    /**
     * @brief   : 获取数据个数
     * @return  :
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual std::size_t Size () = 0;
};

class GetAllIdTrait
{
  public:
    /**
     * @brief   : 获取所有ID
     * @return  :
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual std::vector<SG::DataStructure::Common::Id> GetAllId () = 0;
};

template <typename T>
class FindByIndexTrait
{
  public:
    /**
     * @brief   : 根据Index获取数据
     * @param   : index
     * @param   : entity
     * @return  : 查询是否成功
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual SG::DataStructure::Common::Status FindByIndex (std::size_t index, T& _OUT entity) = 0;
};

template <typename T>
class FindByIdTrait
{
  public:
    /**
     * @brief   : 根据ID获取数据
     * @param   : id
     * @param   : entity
     * @return  : 查询是否成功
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual SG::DataStructure::Common::Status FindById (SG::DataStructure::Common::Id id, T& _OUT entity) = 0;
};

template <typename T>
class FindBySIdFront
{
  public:
    virtual SG::DataStructure::Common::Status FindBySId (SG::DataStructure::Common::Id sId, std::vector<T>& _OUT arrs) = 0;
    virtual SG::DataStructure::Common::Status FindBySId (SG::DataStructure::Common::Id id, T& _OUT entity) = 0;
};

template <typename T>
class GetAllDataTrait
{
  public:
    /**
     * @brief   : Get the All Data object
     * @return  : 所有数据
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual std::vector<T> GetAllData () = 0;
};

class CountTrait
{
  public:
    /**
     * @brief   : 根据ID获取数量
     * @param   : id
     * @return  : 查询到的数量
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual std::size_t Count (SG::DataStructure::Common::Id id) = 0;
};

/**
 * @brief   : 载荷专用接口
 * @tparam T
 * @author  : 武兴创
 * @date    : 2024.10.21
 */
template <typename T>
class FindBySIdTrait
{
  public:
    /**
     * @brief   : 查询指定 `sId` 下的 **
     * @param   : sId
     * @param   : arrs 查找到的数据列表
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual SG::DataStructure::Common::Status FindBySId (SG::DataStructure::Common::Id sId, std::vector<T>& _OUT arrs) = 0;
};

/**
 * @brief    载荷专用接口只查询一个
 *
 * @tparam T
 * @author   wanglong
 * @date     2025.03.10
 */
template <typename T>
class FindBySIdIsOneTrait
{
  public:
    /**
     * @brief   : 查询指定 `sId` 下的 **
     * @param   : sId
     * @param   : arrs 查找到的数据列表
     * @author  : 武兴创
     * @date    : 2024.10.21
     */
    virtual SG::DataStructure::Common::Status FindBySId (SG::DataStructure::Common::Id sId, T& _OUT arrs) = 0;
};
/**
 * @brief   : 单元统一接口
 * @author  : wxc
 * @date    : 2024.11.03
 */
class ElementTrait
{
  public:
    /// @brief 获取单元节点
    /// @param type
    /// @return
    virtual SG::Algebra::Matrix GetElementNodes () const = 0;

    /// @brief
    /// @param type
    /// @return
    virtual std::vector<SG::DataStructure::Common::Id> FindElementNodes (SG::DataStructure::Common::Id eid) const = 0;


};

/**
 * @brief   : 坐标系统一接口
 * @author  : wxc
 * @date    : 2024.11.16
 */
class CoordinateTrait
{
  public:
    /// @brief 所有当前表内所有坐标系，转换为ICoordinate类型
    virtual std::vector<std::shared_ptr<SG::DataStructure::FEM::ICoordinate>> GetAllCoord () = 0;
};

/**
 * @brief    配置获取与设置统一接口
 *
 * @author   wanglong
 * @date     2025.04.14
 */
template <typename T>
class ConfigureTrait
{
  public:
    /// @brief 所有当前表内所有坐标系，转换为ICoordinate类型
    virtual void Set (const T& entity) = 0;
    virtual T    Get ()                = 0;
};

SG_DBMANAGER_NAMESPACE_CLOSE
